<?php
if (!function_exists('cek_username')) {
    function cek_username($username = null) {
        $CI = & get_instance();
        $CI->load->database();
        
        // 1. Cek ID dan Nama pengguna, apakah ada dalam tabel
        $CI->db->select('id, username');
        $CI->db->where('id', $username);
        $CI->db->or_where('username', $username);
        $query_users = $CI->db->get('rc_users');

        if ($query_users->num_rows() > 0) {
            $result_id_username = $query_users->result_array();            
            $query_users->free_result();
        } else {
            $result_id_username = array();
        }

        // 2. Cek slug dari tabel konten_statis, apakah ada dalam tabel
        $CI->db->select('slug');
        $CI->db->where('slug', $username);
        $query_konten_statis = $CI->db->get('konten_statis');

        if ($query_konten_statis->num_rows() > 0) {
            $result_slug_konten_statis = $query_konten_statis->result_array();            
            $query_konten_statis->free_result();
        } else {
            $result_slug_konten_statis = array();
        }

        // 3. Uri segment 1 dari routes.php
        $routes     = array('login', 'logout', 'forgot', 'change_password', 'me', 'uploads', 'login', 'bantuan', 'kirim-pertanyaan', 'lesson', 'download', 'koreksi', 'jawaban-benar');
        
        // 4. Spesial :D
        $reserved   = array('index', 'index.html', 'index.php', 'profile');

        // 5. Cek semua controller
        $controllers = array();
        $CI->load->helper('file');

        // Scan files in the /application/controllers directory
        // Set the second param to TRUE or remove it if you 
        // don't have controllers in sub directories
        $files = get_dir_file_info(APPPATH.'controllers', FALSE);

        // Loop through file names removing .php extension
        foreach (array_keys($files) as $file){
            $controllers[] = str_replace(EXT, '', $file);
        }

        // 6. Cek pola dengan regex, harus sesuai dengan standar yang di tentukan
        // Sumber : http://stackoverflow.com/questions/12018245/regular-expression-to-validate-username
        // atau : https://gist.github.com/khoiruddin/e519dc16f58a4646d767
        // aturan Nama pengguna/Username, sebagai berikut :
        // panjangnya 4-20 karakter termasuk . (titik) dan _ (garis bawah)
        // tidak diawali . (titik) dan atau _ (garis bawah)
        // tidak terdapat __ dan atau _. dan atau ._ dan atau .. didalam Nama pengguna
        // yang dizinkan hanya a-zA-Z0-9._
        // tidak diakhiri . (titik) dan atau _ (garis bawah)
        if(preg_match('/^(?=.{4,20}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$/', $username)){
            $pola = true;
        }else{
            $pola = false;
        }

        // ins_array_ins => Sama dengan in_array, namun ini Case InSensitive
        $CI->load->helper('in_array_case_insensitive');

        // 7. Tentang titik dalam Nama pengguna
        // agussuherman dengan agus.suherman atau agus.su.he.rma.n adalah sama (seperti di facebook)
        $no_dots_username = str_replace('.', '', $username);
        
        // ambil id dan Nama pengguna tanpa dots dari tabel, yang Nama pengguna tanpa dots ($no_dots_username)
        $params = array($no_dots_username,$no_dots_username);
        $sql = 'SELECT id, username 
        FROM rc_users WHERE REPLACE (id, ".", "") = ? OR REPLACE (username, ".", "") = ?';
        $query_users2 = $CI->db->query($sql, $params);

        if ($query_users2->num_rows() > 0) {
            $result_id_and_username_no_dots = $query_users2->result_array();            
            $query_users2->free_result();
        } else {
            $result_id_and_username_no_dots = array();
        }

        if(!empty($result_id_and_username_no_dots)){
            // terlebih dahulu dijadikan satu dimensi; http://stackoverflow.com/questions/13987684/how-to-convert-two-dimensional-array-to-one-dimensional-array-in-php
            // biar lebih mudah aja
            $it                 =  new RecursiveIteratorIterator(new RecursiveArrayIterator($result_id_and_username_no_dots));
            $result_id_and_user = iterator_to_array($it, false);
            // Menghilangkan titik pada hasil query            
            foreach ($result_id_and_user as $value){
                $no_dots_id_and_user[] =  str_replace('.', '', $value);
            }
            // Cek, apakah ID dan Nama pengguna tanpa titik yang diinput sama dengan ID dan Nama pengguna tanpa titik di dalam tabel 
            if(in_array_ins($no_dots_username, $no_dots_id_and_user)){
                $without_dots_id_and_username = true;
            }else{
                $without_dots_id_and_username = false;
            }
        }else{
            $without_dots_id_and_username = false;
        }

        if (empty($username) OR !empty($result_id_username) 
            OR !empty($result_slug_konten_statis) OR in_array_ins($username, $routes) 
            OR in_array_ins($username, $reserved) OR in_array_ins($username, $controllers)
            OR $without_dots_id_and_username === true OR $pola === false){
            return FALSE;
        }else{
            return TRUE;
        }

        // Alhamdulillah     
    }
}

if (!function_exists('cek_username_logged')) {
    function cek_username_logged($username = null) {
        if($username == user_id() OR $username == user_username()){
            echo 'Itu Anda!';
        }else{
            if(cek_username($username)){
                echo 'Selamat, Nama pengguna tersedia!';
            }else{
                echo 'Sayangnya Nama pengguna tidak tersedia';
            }
        }
    }
}